package com.zjsru.plan2025.oneday;

/**
 * 1863. 找出所有子集的异或总和再求和
 *
 * @Author: cookLee
 * @Date: 2025-04-05
 */
public class SubsetXORSum {

    /**
     * 主
     * \
     * 输入：nums = [1,3]
     * 输出：6
     * 解释：[1,3] 共有 4 个子集：
     * - 空子集的异或总和是 0 。
     * - [1] 的异或总和为 1 。
     * - [3] 的异或总和为 3 。
     * - [1,3] 的异或总和为 1 XOR 3 = 2 。
     * 0 + 1 + 3 + 2 = 6
     * \
     * 输入：nums = [5,1,6]
     * 输出：28
     * 解释：[5,1,6] 共有 8 个子集：
     * - 空子集的异或总和是 0 。
     * - [5] 的异或总和为 5 。
     * - [1] 的异或总和为 1 。
     * - [6] 的异或总和为 6 。
     * - [5,1] 的异或总和为 5 XOR 1 = 4 。
     * - [5,6] 的异或总和为 5 XOR 6 = 3 。
     * - [1,6] 的异或总和为 1 XOR 6 = 7 。
     * - [5,1,6] 的异或总和为 5 XOR 1 XOR 6 = 2 。
     * 0 + 5 + 1 + 6 + 4 + 3 + 7 + 2 = 28
     * \
     *
     * @param args args
     */
    public static void main(String[] args) {
        SubsetXORSum subsetXORSum = new SubsetXORSum();
        int[] nums = new int[]{1, 3};
        System.out.println(subsetXORSum.subsetXORSum(nums));
    }

    public int subsetXORSum(int[] nums) {
        return this.helper(0, 0, nums);
    }

    private int helper(int val, int index, int[] nums) {
        if (index == nums.length) {
            return val;
        } else {
            //不选择当前数字 + 选择当前数字
            return this.helper(val, index + 1, nums) + this.helper(val ^ nums[index], index + 1, nums);
        }
    }

}
